package com.huanglaoshi.java.io.fileinputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

/**
 * IO体系：
 * 抽象基类	  		节点流（文件流）
 * InputStream      FileInputStream
 * OutputStream		FileOutputStream
 * Reader			FileReader
 * Writer			FileWriter
 *
 */
public class 字节流_文件输入流_测试 {
	
	@Test
	public void read01() throws Exception {
		//1 创建1个文件对象
		File file = new File("io/hello.txt");
		
		//2 创建1个文件输入流来读取文件的内容
		FileInputStream fis = new FileInputStream(file);
		
		//3 调用输入流对象的方法
		int b =fis.read();
		//System.out.println((char)b);
		
		int counter =0;
		while(b !=-1){
			counter++;
			System.out.print(counter +"\t读到的是："+(char)b);
			//System.out.print((char)b);
			b= fis.read();
			System.out.println("\t再次读 读到的是："+"\t"+(char)b+ "\t"+b);
		}
		//4 关闭相应的流 不是java虚拟机内存的资源。不会垃圾回收
		fis.close();
		
		
	}
	
	@Test
	public void read02() throws Exception {
		//1 创建1个文件对象
		File file = new File("io/hello.txt");
		
		//2 创建1个文件输入流来读取文件的内容
		FileInputStream fis = new FileInputStream(file);
		
		//3 调用输入流对象的方法
		int b;
		while((b=fis.read())!=-1){
			System.out.print((char)b);
		}
		//4 关闭相应的流 不是java虚拟机内存的资源。不会垃圾回收
		fis.close();
		
		
	}
	
	
	/**
	 * 缺点  要读很多次
	 */
	@Test
	public void read03(){
		
		FileInputStream fis=null;
		try {
			//1 创建1个文件对象
			File file = new File("io/hello.txt");
			
			//2 创建1个FileInputStream类的对象
			fis = new FileInputStream(file);
			
			//3 调用输入流对象的方法。实现file文件的读取
			int b;
			while((b=fis.read())!=-1){
				System.out.print((char)b);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				//4 关闭相应的流 访问的是磁盘的资源 不是java虚拟机内存的资源。Java虚拟机不会自动垃圾回收
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	/**
	 * 次佳方案
	 */
	@Test
	public void read04(){
		FileInputStream fis=null;
		try {
			File file = new File("io/hello.txt");
			fis = new FileInputStream(file);
			
			//一次性搬5桶水
			byte[] b = new byte[4];
			//fis读文件,写入到数组b中。每次写入length个。如果返回-1就说明文件读取结束
			int length;
			while((length=fis.read(b)) != -1){
				//循环b
				for(int i=0; i<length;i++){
					char c = (char)b[i];
					System.out.print(c);
				}
				System.out.println();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != fis){
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * 最佳方案
	 */
	@Test
	public void read05(){
		FileInputStream fis=null;
		try {
			File file = new File("io/hello.txt");
			fis = new FileInputStream(file);
			
			//一次性搬5桶水
			byte[] b = new byte[5];
			//fis读文件,写入到数组b中。每次写入length个。如果返回-1就说明文件读取结束
			int length;
			while((length=fis.read(b)) != -1){
				
				String str = new String(b,0,length);
				//String str = new String(b,0,b.length);
				//String str = new String(b);
				System.out.print(str);
				//System.out.println();
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != fis){
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
